Oracle Database
概念
階層構造を把握しておく
旧式(non-CDB)は23ai では利用不可
CDB / PDB の構成 (新)
マルチテナント・アーキテクチャ、らしい。
親DB(マルチテナントコンテナデータベース CDB)と子DB(PluggableDB PDB)。CDBは基本的に管理用。
free版のCDB名はFREE、初期設定ではFREEPDB1でPDBが1つ作られる。lite版ではPDB名が指定可能?
express版(21c) では CDB XE, PDB XEPDB1
Oracle Database
CDB (FREE)
PDB (FREEPDB1)
アプリケーションコンテナ
PDB
管理データ
共通ユーザー
管理
管理アカウントは全体管理可能なsys、 CDB用の system と PDB用の pdbadmin。 SYSとSYSTEMはDBAロールを持つ。
SYS DB(CDB,PDB)外も含めて全部できる バックアップ、リカバリ、アップグレード
SYSTEM DB(CDB,PDB)内の全部できる
PDBADMIN PDB内の全部できる
アカウントの他、権限がある
AS SYSDBA 管理権限を付与する デフォルトスキーマ SYS
AS SYSOPER データにアクセスできない管理権限 デフォルトスキーマ PUBLIC
SYS AS SYSDBA など管理ユーザにログイン時権限付きで指定する
ログイン (認証)
OSのアカウント、CDBのSYS, SYSTEM, PDBのPDBADMIN などがある。
CDB, PDBにはサービス名(Service Name)で接続する。Service Nameの重複は階層に関係なく不可。
構築
いろいろ
Compose
Compose
podman composeで free版 または express版などを試してみる 23ai free は 21c express の後継
imageサイズ9GB程度
適当に compose.yaml を用意する
code:compose.yaml
services:
oracledb:
image: container-registry.oracle.com/database/free:latest
environment:
ORACLE_PWD: password
volumes:
- ./oradata:/opt/oracle/oradata
ports:
- "1521:1521"
image の free を express にすると express版だがfreeの方が新しい
ORACLE_PWD で管理用パスワードを指定する
外部からの接続用にportsを指定する
外部に晒さないようにするにはサーバアドレスも付ける 127.0.0.1:1521:1521
lite版もあるのかも
lite版はfree:latest を free:23.4.0.0-lite に変更
environment ORACLE_PDBでPDB名を指定可能 (volumesでdata領域をを指定したとき?)
ORACLE_SIDも指定できるかもしれない
データ領域
lite版 ? volumes を省略してもよい。事前にimage内部に作成されているものを使うと速いのかも
作成する場合にはファイルとVOLUMESとを選ぶ
ファイルの場合 上のcompose.yaml を使う
oradata を 54321:54321 のUID で作成する。WindowsではUID設定不要
code:shell
mkdir oradata
chown 54321:54321 oradata
volume管理でいい場合は
code:compose.yaml
services:
oracledb:
image: container-registry.oracle.com/database/free:latest
environment:
ORACLE_PWD: password
volumes:
- oradata:/opt/oracle/oradata
ports:
- "1521:1521"
volumes:
oradata:
volumes を services と同列に作成してvolume名を追加、oracledbのvolumes のフォルダ名 (./開始)をvolume名 (./なし)に変える
起動
code:sh
podman compose up -d
初期化に5分くらい待ち
詳細は知らないが
接続にはService Name (サービス名)という名を使う。ほかにSIDがあるが、8.0以前くらいのもの?
コンテナデータベース(CDB)という親DBとぷらがぶるDB(PDB)という仮想DBがある
FREE/FREEPDB1 や XE/XEPDB1という階層になっているようだ。
仮想DB側を使う
管理用アカウントは sys, system, pdbadmin などがあるのかも
table:階層
CDB PDB
Host localhost localhost
Port 1521 1521
Database (free版) FREE FREEPDB1
Database (free lite版) FREE ORACLE_PDB(FREEPDB1など)
Database (express版) XE XEPDB1
管理ユーザー名/Role
sys/SYSDBA ○ ○
sys/SYSOPER ○ ○
system ○ ○
pdbadmin - ○
パスワード ORACLE_PWD ORACLE_PWD
管理ユーザは3種類あるが使い分けはまだ知らない
パスワードはcompose.yaml で指定したもので共通
管理環境
標準のコマンドラインツール SQL*Plus
DB管理は DBeaver というのを使ってみているのでそこからつつく NetBeansやIntelliJ IDEAなどの開発ツールからJDBCで繋いでも sqlがつつければ同じ sys, system, pdbadmin それぞれで接続できるまで待ち
table:JDBC
Class oracle.jdbc.driver.OracleDriver
JDBC URL jdbc:oracle:thin:@host:port:SID jdbc:oracle:thin://host:port/ServiceName
Port 1521
DataSource oracle.jdbc.pool.OracleDataSource
oracle.jdbc.xa.client.OracleXADataSource
PoolなしのDataSource はないのかも
code:Maven JDBC 4.2 JDK 8
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>[23.0,)</version>
<type>jar</type>
</dependency>
code:Maven JDBC 4.3 JDK 11以降
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc11</artifactId>
<version>[23.0,)</version>
<type>jar</type>
</dependency>
jdbc6, jdbc8, jdbc10 (19cのみ), jdbc11 などがあるようだ
JDBCのURLはSIDとService Nameの場合で別
code:url
SID
Service Name
username, password は別で指定することもできるので省略可
sysdbaなどRoleはinternal_logon プロパティで指定する?
SQL*Plus
podman から sqlplus を使う場合は podman ps で名前(NAMES)を確認
oracle_oracledb_1 などになっているので<oracledb> のところを変える
$ podman exec -it <oracledb> sqlplus sys/<ぱすわーど>@FREE as sysdba
$ podman exec -it <oracledb> sqlplus system/<ぱすわーど>@FREE
$ podman exec -it <oracledb> sqlplus pdbadmin/<ぱすわーど>@FREEPDB1
などでユーザ、パスワード、サービス名、ロールを指定できる
例
$ podman exec -it oracle-pod-oracle sqlplus sys/password@FREE as sysdba
ホスト指定
$ sqlplus sys/<password>@//localhost:1521/FREE as sysdba
$ sqlplus system/<password>@//localhost:1521/FREE
$ sqlplus pdbadmin/<password>@//localhost:1521/FREEPDB1
ユーザ作成
CDBに一般ユーザの作成はできない
同名のスキーマも作成される
sys as SYSDBA または system で PDB側に接続、sqlplusでもDBeaver でも何でもよい
$ podman exec -it <oracledb> sqlplus sys/<ぱすわーど>@FREEPDB1 as sysdba
ユーザとパスワード
code:sql
CREATE USER ゆーざめい IDENTIFIED BY ぱすわーど;
username でも "username" でもよさそう
権限付与
基本的に自分所有データの参照が可能
権限だかロールを付与する (非推奨なのかも)
code:sql
GRANT CONNECT , RESOURCE TO ゆーざめい;
CONNECT ログイン可能
RESOURCE 適度な操作 VIEWなどは作成不可
DBA 管理 SYSTEMと同じ データベースの起動停止などは不可
CREATE TABLE
CREATE VIEW
UNLIMITED TABLESPACE 書き込み制限なし
usernameと同名のスキーマも作成されているので基本的にそのスキーマを利用する形
GRANT CREATE TABLE TO アカウント;
は必要? 不要 RESOURCE ロールに含まれる
ログイン
code:sql
CREATE
スクリプト実行
startup と setup の2種類のスクリプト(拡張子 .shと.sql)を実行可能
SQL は sys as SYSDBA で実行される
SH は カレントユーザで実行される
volumes に
- ./startup:/opt/oracle/scripts/startup
- ./setup:/opt/oracle/scripts/setup
とそれぞれのフォルダを作る
01_ 02_ など番号をつけてファイル名順に実行することができる
volumeを指定しなかった場合は設定済みDBを使うのでsetupは実行されない
setup に ユーザ作成のsqlなどを仕込んでおくといいのか?
Pod にしてみる
Compose ではなく Kubernetes のPod にしてみる port は pod 側で指定するが、コンテナからでも作れなくはないのでコンテナだけ作ってもいい
$ podman pod create -p 1521:1521 oracle
$ podman create --name oracle23ai --pod oracle -e ORACLE_PWD=password -v oradata:/opt/oracle/oradata container-registry.oracle.com/database/free:latest
開始
$ podman pod start oracle
停止
$ podman pod stop oracle
設定の保存
$ podman generate kube oracle-pod -f oracle.yaml
設定の読み込み実行
$ podman play kube oracle.yaml
コンテナから作る
$ podman create --name oracle23ai -p 1521:1521 -e ORACLE_PWD=password -v oradata:/opt/oracle/oradata container-registry.oracle.com/database/free:latest
$ podman generate kube oracle23ai -f oracle.yaml
削除
$ podman pod rm oracle
systemd 化
podを削除して oracle.yaml がある状態
code:oracle.kube
Description=Oracle Database 23ai
Before=local-fs.target
Yaml=/path/to/oracle.yaml
PublishPort=1521:1521
Restart=always
WantedBy=multi-user.target default.target
.kube は Description Yaml PublishPort だけ変えて使い回し
user の場合
$ mkdir -p ~/.config/containers/systemd
$ cp oracle.kube ~/.config/containers/systemd
$ /usr/lib/systemd/system-generators/podman-system-generator -user -dryrun
$ systemctl --user daemon-reload
$ systemctl --user enable --now oracle
開始
$ systemctl --user start oracle
停止
$ systemctl --user stop oracle
rootの場合
$ cp oracle.kube /etc/containers/systemd
$ /usr/lib/systemd/system-generators/podman-system-generator -dryrun
$ systemctl daemon-reload
$ systemctl enable --now oracle
開始
$ systemctl start oracle
停止
$ systemctl stop oracle